/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Consulta;
import desarrollosoft.ghce.entidades.Elemento;
import desarrollosoft.ghce.entidades.Estudio;
import desarrollosoft.ghce.entidades.EstudioImaginologia;
import desarrollosoft.ghce.entidades.EstudioLaboratorio;
import desarrollosoft.ghce.entidades.Gravedad;
import desarrollosoft.ghce.entidades.Intervencion;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.entidades.Tratamiento;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.soporte.SecurityUtil;
import desarrollosoft.ghce.vista.interfaces.Actualizable;
import desarrollosoft.ghce.vista.interfaces.Cambiable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraConsultarHistorial extends SelectorComposer<Window> implements Actualizable {
    
    @WireVariable("servicioHistorial")
    private IServicioHistorial servicioHistorial;
    
    private Cambiable cambiable;
    
    private Paciente pacienteElegido;
    
    private String nombreUsuarioActual;
    
    private Window ventanaAnterior;
    
    private List<Gravedad> listaGravedades;
    
    @Wire
    private Textbox textboxDescripcion;
    
    @Wire
    private Combobox comboboxGravedad;
    
    @Wire
    private Listbox listboxElementos;
    
    @Wire
    private Window ventanaDetalles;
    
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        hacerAntesDeDibujar();
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }
    
    private void hacerAntesDeDibujar() {
        Execution ejecucion = Executions.getCurrent();
        cambiable = (Cambiable) ejecucion.getArg().get("controladoraPrincipal");
        pacienteElegido = (Paciente) ejecucion.getArg().get("pacienteElegido");
        
        nombreUsuarioActual = SecurityUtil.getUserName();
    }
    
    private void hacerDespuesDeDibujar() {
        ListitemRenderer renderer = new RendererElementos();
        listboxElementos.setItemRenderer(renderer); //seteo el renderer a la listbox de elementos
        
        // seteo modelo al combo de busqueda
        listaGravedades = servicioHistorial.obtenerTodasGravedades();
        
        Gravedad gravedadEspecial = new Gravedad();
        gravedadEspecial.setNombre("Todas");
        listaGravedades.add(0, gravedadEspecial);
        
        
        comboboxGravedad.setModel(new ListModelList<>(listaGravedades));
        clickBotonBuscar();
    }
    
    @Listen("onClick = #botonBuscar")
    public void clickBotonBuscar() {
        String descripcion = textboxDescripcion.getValue();
        int indiceGravedad = comboboxGravedad.getSelectedIndex();
        Gravedad gravedad;
        
        if (indiceGravedad <= 0) {
            gravedad = null;
        } else {
            gravedad = listaGravedades.get(indiceGravedad);
        }
        
        List<Elemento> listaElementos = servicioHistorial.buscarElementos(pacienteElegido, descripcion, gravedad);
        listboxElementos.setModel(new ListModelList<>(listaElementos));
        setearDetalles("", null, null); // seteo en vacia la ventana de detalles
    }
    
    @Listen("onSelect = #listboxElementos")
    public void eligieronElemento() {
        Elemento elementoElegido = listboxElementos.getSelectedItem().getValue();

        if (elementoElegido != null) {
            String nombreClase = elementoElegido.getClass().getSimpleName();
            setearDetalles(nombreClase, elementoElegido, Estado.CONSULTANDO);
        }
    }
    
    @Listen("onClick = #botonModificar")
    public void clickEnModificar() {
        Elemento elementoElegido = listboxElementos.getSelectedItem().getValue();

        if (elementoElegido != null) {
            if (pacienteElegido.getBajaLogicaPaciente() != null) {
                Messagebox.show("No puede modificar elementos de un Paciente dado de baja");
                return;
            }
            // solo para los estudios...
            if (elementoElegido instanceof Estudio && !elementoElegido.getProfesional().getNombreUsuario().equals(nombreUsuarioActual)) {
                Estudio estudio = (Estudio) elementoElegido;
                // si ya lo completaron y no es el mismo que lo quiere modificar...
                if (estudio.getProfesionalQueLoCompleto() != null
                        && !estudio.getProfesionalQueLoCompleto().getNombreUsuario().equals(nombreUsuarioActual)) {
                    Messagebox.show("No puede modificar el estudio porque fue completado por otro Profesional");
                    return;
                }
            } else if (!elementoElegido.getProfesional().getNombreUsuario().equals(nombreUsuarioActual)) {
                Messagebox.show("No puede modificar el elemento porque usted no es el Profesional que lo creó");
                return;
            }

            String nombreClase = elementoElegido.getClass().getSimpleName();
            setearDetalles(nombreClase, elementoElegido, Estado.MODIFICANDO);
        }
    }
    
    @Listen("onClick = #botonEliminar")
    public void clickEnEliminar() {
        Listitem item = listboxElementos.getSelectedItem();
        
        if (item == null) { // si el item es null, corto
            return;
        }
        
        final Elemento elementoElegido = item.getValue(); // solo obtengo el valor, cuando tengo la posta
        
        if (elementoElegido != null) {
            if (pacienteElegido.getBajaLogicaPaciente() != null) {
                Messagebox.show("No puede eliminar elementos de un Paciente dado de baja");
                return;
            }
            if (!elementoElegido.getProfesional().getNombreUsuario().equals(nombreUsuarioActual)) {
                Messagebox.show("No puede eliminar el elemento porque usted no es el Profesional que lo creó");
                return;
            }
            Messagebox.show("¿Confirma que desea ELIMINAR el Elemento seleccionado?", "Confirme por favor",
                    Messagebox.YES | Messagebox.NO, Messagebox.QUESTION,
                    new EventListener() {
                        @Override
                        public void onEvent(Event evt) throws InterruptedException {
                            if (evt.getName().equals("onYes")) { // si confirma
                                if (elementoElegido instanceof Consulta) { // si es consulta
                                    try {
                                        servicioHistorial.eliminarConsulta((Consulta) elementoElegido, nombreUsuarioActual);
                                    } catch (Exception ex) {
                                        Messagebox.show("Error: " + ex.toString());
                                    }
                                } else if (elementoElegido instanceof Tratamiento) { // si es tratamiento
                                    try {
                                        servicioHistorial.eliminarTratamiento((Tratamiento) elementoElegido, nombreUsuarioActual);
                                    } catch (Exception ex) {
                                        Messagebox.show("Error: " + ex.toString());
                                    }
                                } else if (elementoElegido instanceof Intervencion) {
                                    try {
                                        servicioHistorial.eliminarIntervencion((Intervencion) elementoElegido, nombreUsuarioActual);
                                    } catch (Exception ex) {
                                        Messagebox.show("Error: " + ex.toString());
                                    }
                                } else if (elementoElegido instanceof EstudioLaboratorio) {
                                    try {
                                        servicioHistorial.eliminarEstudioLaboratorio((EstudioLaboratorio) elementoElegido,nombreUsuarioActual);
                                    } catch (Exception ex) {
                                        Messagebox.show("Error: " + ex.toString());
                                    }
                                } else if (elementoElegido instanceof EstudioImaginologia) {
                                    try {
                                        servicioHistorial.eliminarEstudioImaginologia((EstudioImaginologia) elementoElegido,nombreUsuarioActual);
                                    } catch (Exception ex) {
                                        Messagebox.show("Error: " + ex.toString());
                                    }
                                }
                                clickBotonBuscar(); // hago como que buscaron para actualizar la tabla
                            }
                        }
                    }
            );
        }
    }
    
    @Listen("onClick = #botonVerProfesional")
    public void clickBotonVerProfesional() {
        Listitem item = listboxElementos.getSelectedItem();
        
        if (item == null) { // si el item es null, corto
            return;
        }
        
        Elemento elementoSeleccionado = item.getValue();
        
        Map<String, Object> argumentos = new HashMap<>();
        argumentos.put("profesional",elementoSeleccionado.getProfesional());
        Window ventana = (Window) Executions.createComponents("VentanaDetallesProfesional.zul", null, argumentos);
        ventana.doModal();
    }
    
    private void setearDetalles(String nombreClase, Elemento elemento, Estado estado) {
        Window ventana = null;
        Map<String,Object> argumentos;
        
        switch (nombreClase) {
            case "Consulta":
                argumentos = new HashMap<>();
                argumentos.put("consulta", elemento);
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("actualizable",this);
                argumentos.put("estado",estado);
                ventana = (Window) Executions.createComponents("VentanaConsulta.zul", null, argumentos);
                break;
            case "Tratamiento":
                argumentos = new HashMap<>();
                argumentos.put("tratamiento", elemento);
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("actualizable",this);
                argumentos.put("estado",estado);
                ventana = (Window) Executions.createComponents("VentanaTratamiento.zul", null, argumentos);
                break;
            case "Intervencion":
                argumentos = new HashMap<>();
                argumentos.put("intervencion", elemento);
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("actualizable",this);
                argumentos.put("estado",estado);
                ventana = (Window) Executions.createComponents("VentanaIntervencion.zul", null, argumentos);
                break;
            case "EstudioLaboratorio":
                argumentos = new HashMap<>();
                argumentos.put("estudioLaboratorio", elemento);
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("actualizable",this);
                argumentos.put("estado",estado);
                ventana = (Window) Executions.createComponents("VentanaCargaResultadoLaboratorio.zul", null, argumentos);
                break;
            case "EstudioImaginologia":
                argumentos = new HashMap<>();
                argumentos.put("estudioImaginologia", elemento);
                argumentos.put("paciente", pacienteElegido);
                argumentos.put("actualizable",this);
                argumentos.put("estado",estado);
                ventana = (Window) Executions.createComponents("VentanaCargaResultadoImaginologia.zul", null, argumentos);
                break;
            default :
                // no hace nada
                break;
        }
        if (ventanaAnterior != null) {
            ventanaDetalles.removeChild(ventanaAnterior);
            ventanaAnterior = null;
        }
        if (ventana != null) {
            ventanaDetalles.appendChild(ventana);
            ventanaAnterior = ventana;
        }
    }

    @Override
    public void guardaronVentanaHija(Object objetoActualizado) {
        clickBotonBuscar();
    }

    @Override
    public void cancelaron() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
